package com.aloha.minio.service;

import com.aloha.minio.entity.MinioResult;
import com.j256.simplemagic.ContentInfo;
import com.j256.simplemagic.ContentInfoUtil;
import org.apache.commons.io.FilenameUtils;
import org.springframework.util.StringUtils;

import java.io.File;
import java.util.concurrent.TimeUnit;

/**
 * @author DaiZhiHeng
 * @description 服务接口
 * @date 2023/4/5 14:18
 */

public interface MinioService {

    /**
     * 上传图片等小文件
     *
     * @param data       文件的字节数组
     * @param objectName 远程文件名(完整路径) 例如：2020/01/01/1.jpg
     */
    MinioResult uploadFile(byte[] data, String objectName);

    /**
     * 上传视频等大文件
     *
     * @param localFilePath 文件的本地位置
     * @param objectName    远程文件名(完整路径) 例如：2020/01/01/1.mp4
     */
    MinioResult uploadFile(String localFilePath, String objectName);

    /**
     * 检查文件是否存在
     *
     * @param objectName 远程文件名(完整路径) 例如：2020/01/01/1.jpg
     * @return Boolean
     */
    boolean exists(String objectName);

    /**
     * 下载文件到指定的file
     *
     * @param target     下载的文件保存的目标位置
     * @param objectName 远程文件名(完整路径) 例如：2020/01/01/1.jpg
     * @return 第一个参数 target
     */
    File download(File target, String objectName);

    /**
     * 删除指定文件
     *
     * @param objectName 远程文件名(完整路径) 例如：2020/01/01/1.jpg
     * @return Boolean
     */
    boolean delete(String objectName);

    /**
     * 删除指定的目录
     *
     * @param dir 远程文件目录 例如：2020/01/01/
     */
    void deleteDir(String dir);

    /**
     * 用于前端直传文件时获取的签名
     *
     * @param expire     过期时间
     * @param unit       时间单位
     * @param objectName 远程文件名(完整路径) 例如：2020/01/01/1.jpg
     */
    String policy(int expire, TimeUnit unit, String objectName);

    /**
     * 获取文件的类型
     */
    default String getContentType(String filename) {
        // 默认是二进制流的格式
        String contentType = "application/octet-stream";
        if (StringUtils.hasText(filename)) {
            ContentInfo info = ContentInfoUtil
                    .findExtensionMatch(FilenameUtils.getExtension(filename));
            if (info != null)
                contentType = info.getMimeType();
        }
        return contentType;
    }
}
